g_atomic_int_inc (&queue->holds);
}
+static gboolean
+invoke_idle_callback (gpointer user_data)
+{
+ OtWorkerQueue *queue = user_data;
+ queue->idle_callback (queue->idle_data);
+ return FALSE;
+}
+
void
ot_worker_queue_release (OtWorkerQueue *queue)
{
- g_atomic_int_add (&queue->holds, -1);
+ if (!g_atomic_int_dec_and_test (&queue->holds))
+ return;
+
+ g_mutex_lock (&queue->mutex);
+
+ if (!g_queue_peek_tail_link (&queue->queue))
+ {
+ if (queue->idle_callback)
+ g_main_context_invoke (queue->idle_context,
+ invoke_idle_callback,
+ queue);
+ }
+
+ g_mutex_unlock (&queue->mutex);
}
void
g_mutex_unlock (&queue->mutex);
}
-static gboolean
-invoke_idle_callback (gpointer user_data)
-{
- OtWorkerQueue *queue = user_data;
- queue->idle_callback (queue->idle_data);
- return FALSE;
-}
-
static gpointer
ot_worker_queue_thread_main (gpointer user_data)
{